package com.dbdata.move.service;

import com.dbdata.move.Utils;
import com.dbdata.move.dao.StudentClassDao;
import com.dbdata.move.model.StudentClass;
import com.dbdata.move.vo.StudentClassVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.*;

/**
 * 学员期班数据处理类
 * @author Richard
 *
 */
@Service
public class StudentClassService {

    private static final Logger L = LoggerFactory.getLogger(StudentClassService.class);

    @Autowired
    private StudentClassDao dao;

    public void saveClass() {
        String filePath = "D:\\VMShare\\stu_qiban.txt";

        try {
            List<String> list = Utils.readCsvFileNoHead(filePath, "UTF-8");
            Map<String, List<String>> map = getClassMap(list);
            for (String s : map.keySet()) {
                StudentClass studentClass = new StudentClass();
                studentClass.setClassName(s);
                List<String> listXcls = map.get(s);
                dao.save(studentClass);
                for (String xcls : listXcls) {
                    StudentClass xsc = new StudentClass();
                    xsc.setClassName(xcls);
                    xsc.setStudentClass(studentClass);
                    dao.save(xsc);
                }

            }
        } catch (IOException e) {
            L.error("读取学员期班原始数据出错！", e);
        }

    }

    /**
     * 获取期班信息
     * @param list 期班原始数据列表
     * @return 期班信息
     */
    private Map<String, List<String>> getClassMap(List<String> list) {
        Map<String, List<String>> map = new HashMap<String, List<String>>(100);

        for (String s : list) {
            String[] item = s.split(",");

            if (item.length <= 1) {
                continue;
            }

            // 获取班级名称,如果班级名称为空则让班级名称等于“其他”
            String className = item[0].trim().equals("") ? "其他" : item[0].trim();
            // 获取小班名称
            String xclassName = item[1].trim();

            // 不存在班级名称，则将班级名称添加到map中
            if (!map.containsKey(className)) {
                List<String> xclsList = new ArrayList<String>();
                // 班级名称与小班名称不相等并且小班不为空，则添加对应的小班到列表，否则只添加班级名称
                if (!className.equals(xclassName) && !"".equals(xclassName)) {
                    xclsList.add(xclassName);
                }
                map.put(className, xclsList);

            } else if (!"".equals(xclassName) && !className.equals(xclassName)
                    && !map.get(className).contains(xclassName)) {
                // 小班不为空 && 班级名称不等于小班名称 && 小班还未添加到列表，则将新的小班添加到列表

                map.get(className).add(xclassName);
            }
        }
        return map;
    }

    /**
     * 获取所有的期班信息
     * @return 期班信息
     */
    public Map<String, Long> getClassAll() {
        List<StudentClassVo> list = dao.findStuClassAll();
        // 班级Map
        Map<String, Long> clsMap = new HashMap<String, Long>();

        for (StudentClassVo o : list) {
            if (!clsMap.containsKey(o.getName())) {
                clsMap.put(o.getName(), o.getId());
            } else {
                L.warn("存在相同的期班信息：{}", o.getName());
            }
        }

        L.debug("获取到的期班总个数：{}", clsMap.size());

        return clsMap;
    }

}
